import random
import socket
import struct
import sys
from concurrent.futures import ThreadPoolExecutor

CipherSuites = {
    0x0000: ('TLS_NULL_WITH_NULL_NULL', True, False, '[RFC5246]'),
    0x0001: ('TLS_RSA_WITH_NULL_MD5', True, False, '[RFC5246]'),
    0x0002: ('TLS_RSA_WITH_NULL_SHA', True, False, '[RFC5246]'),
    0x0003: ('TLS_RSA_EXPORT_WITH_RC4_40_MD5', False, False, '[RFC4346][RFC6347]'),
    0x0004: ('TLS_RSA_WITH_RC4_128_MD5', False, False, '[RFC5246][RFC6347]'),
    0x0005: ('TLS_RSA_WITH_RC4_128_SHA', False, False, '[RFC5246][RFC6347]'),
    0x0006: ('TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5', True, False, '[RFC4346]'),
    0x0007: ('TLS_RSA_WITH_IDEA_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x0008: ('TLS_RSA_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x0009: ('TLS_RSA_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x000A: ('TLS_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x000B: ('TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x000C: ('TLS_DH_DSS_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x000D: ('TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x000E: ('TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x000F: ('TLS_DH_RSA_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x0010: ('TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x0011: ('TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x0012: ('TLS_DHE_DSS_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x0013: ('TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x0014: ('TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x0015: ('TLS_DHE_RSA_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x0016: ('TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x0017: ('TLS_DH_anon_EXPORT_WITH_RC4_40_MD5', False, False, '[RFC4346][RFC6347]'),
    0x0018: ('TLS_DH_anon_WITH_RC4_128_MD5', False, False, '[RFC5246][RFC6347]'),
    0x0019: ('TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA', True, False, '[RFC4346]'),
    0x001A: ('TLS_DH_anon_WITH_DES_CBC_SHA', True, False, '[RFC5469][status-change-tls-des-idea-ciphers-to-historic]'),
    0x001B: ('TLS_DH_anon_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5246]'),
    0x001E: ('TLS_KRB5_WITH_DES_CBC_SHA', True, False, '[RFC2712]'),
    0x001F: ('TLS_KRB5_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC2712]'),
    0x0020: ('TLS_KRB5_WITH_RC4_128_SHA', False, False, '[RFC2712][RFC6347]'),
    0x0021: ('TLS_KRB5_WITH_IDEA_CBC_SHA', True, False, '[RFC2712]'),
    0x0022: ('TLS_KRB5_WITH_DES_CBC_MD5', True, False, '[RFC2712]'),
    0x0023: ('TLS_KRB5_WITH_3DES_EDE_CBC_MD5', True, False, '[RFC2712]'),
    0x0024: ('TLS_KRB5_WITH_RC4_128_MD5', False, False, '[RFC2712][RFC6347]'),
    0x0025: ('TLS_KRB5_WITH_IDEA_CBC_MD5', True, False, '[RFC2712]'),
    0x0026: ('TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA', True, False, '[RFC2712]'),
    0x0027: ('TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA', True, False, '[RFC2712]'),
    0x0028: ('TLS_KRB5_EXPORT_WITH_RC4_40_SHA', False, False, '[RFC2712][RFC6347]'),
    0x0029: ('TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5', True, False, '[RFC2712]'),
    0x002A: ('TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5', True, False, '[RFC2712]'),
    0x002B: ('TLS_KRB5_EXPORT_WITH_RC4_40_MD5', False, False, '[RFC2712][RFC6347]'),
    0x002C: ('TLS_PSK_WITH_NULL_SHA', True, False, '[RFC4785]'),
    0x002D: ('TLS_DHE_PSK_WITH_NULL_SHA', True, False, '[RFC4785]'),
    0x002E: ('TLS_RSA_PSK_WITH_NULL_SHA', True, False, '[RFC4785]'),
    0x002F: ('TLS_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0030: ('TLS_DH_DSS_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0031: ('TLS_DH_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0032: ('TLS_DHE_DSS_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0033: ('TLS_DHE_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0034: ('TLS_DH_anon_WITH_AES_128_CBC_SHA', True, False, '[RFC5246]'),
    0x0035: ('TLS_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x0036: ('TLS_DH_DSS_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x0037: ('TLS_DH_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x0038: ('TLS_DHE_DSS_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x0039: ('TLS_DHE_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x003A: ('TLS_DH_anon_WITH_AES_256_CBC_SHA', True, False, '[RFC5246]'),
    0x003B: ('TLS_RSA_WITH_NULL_SHA256', True, False, '[RFC5246]'),
    0x003C: ('TLS_RSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x003D: ('TLS_RSA_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x003E: ('TLS_DH_DSS_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x003F: ('TLS_DH_RSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x0040: ('TLS_DHE_DSS_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x0041: ('TLS_RSA_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0042: ('TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0043: ('TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0044: ('TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0045: ('TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0046: ('TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA', True, False, '[RFC5932]'),
    0x0067: ('TLS_DHE_RSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x0068: ('TLS_DH_DSS_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x0069: ('TLS_DH_RSA_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x006A: ('TLS_DHE_DSS_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x006B: ('TLS_DHE_RSA_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x006C: ('TLS_DH_anon_WITH_AES_128_CBC_SHA256', True, False, '[RFC5246]'),
    0x006D: ('TLS_DH_anon_WITH_AES_256_CBC_SHA256', True, False, '[RFC5246]'),
    0x0084: ('TLS_RSA_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x0085: ('TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x0086: ('TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x0087: ('TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x0088: ('TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x0089: ('TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA', True, False, '[RFC5932]'),
    0x008A: ('TLS_PSK_WITH_RC4_128_SHA', False, False, '[RFC4279][RFC6347]'),
    0x008B: ('TLS_PSK_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC4279]'),
    0x008C: ('TLS_PSK_WITH_AES_128_CBC_SHA', True, False, '[RFC4279]'),
    0x008D: ('TLS_PSK_WITH_AES_256_CBC_SHA', True, False, '[RFC4279]'),
    0x008E: ('TLS_DHE_PSK_WITH_RC4_128_SHA', False, False, '[RFC4279][RFC6347]'),
    0x008F: ('TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC4279]'),
    0x0090: ('TLS_DHE_PSK_WITH_AES_128_CBC_SHA', True, False, '[RFC4279]'),
    0x0091: ('TLS_DHE_PSK_WITH_AES_256_CBC_SHA', True, False, '[RFC4279]'),
    0x0092: ('TLS_RSA_PSK_WITH_RC4_128_SHA', False, False, '[RFC4279][RFC6347]'),
    0x0093: ('TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC4279]'),
    0x0094: ('TLS_RSA_PSK_WITH_AES_128_CBC_SHA', True, False, '[RFC4279]'),
    0x0095: ('TLS_RSA_PSK_WITH_AES_256_CBC_SHA', True, False, '[RFC4279]'),
    0x0096: ('TLS_RSA_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x0097: ('TLS_DH_DSS_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x0098: ('TLS_DH_RSA_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x0099: ('TLS_DHE_DSS_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x009A: ('TLS_DHE_RSA_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x009B: ('TLS_DH_anon_WITH_SEED_CBC_SHA', True, False, '[RFC4162]'),
    0x009C: ('TLS_RSA_WITH_AES_128_GCM_SHA256', True, False, '[RFC5288]'),
    0x009D: ('TLS_RSA_WITH_AES_256_GCM_SHA384', True, False, '[RFC5288]'),
    0x009E: ('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256', True, True, '[RFC5288]'),
    0x009F: ('TLS_DHE_RSA_WITH_AES_256_GCM_SHA384', True, True, '[RFC5288]'),
    0x00A0: ('TLS_DH_RSA_WITH_AES_128_GCM_SHA256', True, False, '[RFC5288]'),
    0x00A1: ('TLS_DH_RSA_WITH_AES_256_GCM_SHA384', True, False, '[RFC5288]'),
    0x00A2: ('TLS_DHE_DSS_WITH_AES_128_GCM_SHA256', True, False, '[RFC5288]'),
    0x00A3: ('TLS_DHE_DSS_WITH_AES_256_GCM_SHA384', True, False, '[RFC5288]'),
    0x00A4: ('TLS_DH_DSS_WITH_AES_128_GCM_SHA256', True, False, '[RFC5288]'),
    0x00A5: ('TLS_DH_DSS_WITH_AES_256_GCM_SHA384', True, False, '[RFC5288]'),
    0x00A6: ('TLS_DH_anon_WITH_AES_128_GCM_SHA256', True, False, '[RFC5288]'),
    0x00A7: ('TLS_DH_anon_WITH_AES_256_GCM_SHA384', True, False, '[RFC5288]'),
    0x00A8: ('TLS_PSK_WITH_AES_128_GCM_SHA256', True, False, '[RFC5487]'),
    0x00A9: ('TLS_PSK_WITH_AES_256_GCM_SHA384', True, False, '[RFC5487]'),
    0x00AA: ('TLS_DHE_PSK_WITH_AES_128_GCM_SHA256', True, True, '[RFC5487]'),
    0x00AB: ('TLS_DHE_PSK_WITH_AES_256_GCM_SHA384', True, True, '[RFC5487]'),
    0x00AC: ('TLS_RSA_PSK_WITH_AES_128_GCM_SHA256', True, False, '[RFC5487]'),
    0x00AD: ('TLS_RSA_PSK_WITH_AES_256_GCM_SHA384', True, False, '[RFC5487]'),
    0x00AE: ('TLS_PSK_WITH_AES_128_CBC_SHA256', True, False, '[RFC5487]'),
    0x00AF: ('TLS_PSK_WITH_AES_256_CBC_SHA384', True, False, '[RFC5487]'),
    0x00B0: ('TLS_PSK_WITH_NULL_SHA256', True, False, '[RFC5487]'),
    0x00B1: ('TLS_PSK_WITH_NULL_SHA384', True, False, '[RFC5487]'),
    0x00B2: ('TLS_DHE_PSK_WITH_AES_128_CBC_SHA256', True, False, '[RFC5487]'),
    0x00B3: ('TLS_DHE_PSK_WITH_AES_256_CBC_SHA384', True, False, '[RFC5487]'),
    0x00B4: ('TLS_DHE_PSK_WITH_NULL_SHA256', True, False, '[RFC5487]'),
    0x00B5: ('TLS_DHE_PSK_WITH_NULL_SHA384', True, False, '[RFC5487]'),
    0x00B6: ('TLS_RSA_PSK_WITH_AES_128_CBC_SHA256', True, False, '[RFC5487]'),
    0x00B7: ('TLS_RSA_PSK_WITH_AES_256_CBC_SHA384', True, False, '[RFC5487]'),
    0x00B8: ('TLS_RSA_PSK_WITH_NULL_SHA256', True, False, '[RFC5487]'),
    0x00B9: ('TLS_RSA_PSK_WITH_NULL_SHA384', True, False, '[RFC5487]'),
    0x00BA: ('TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00BB: ('TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00BC: ('TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00BD: ('TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00BE: ('TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00BF: ('TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C0: ('TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C1: ('TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C2: ('TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C3: ('TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C4: ('TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C5: ('TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256', True, False, '[RFC5932]'),
    0x00C6: ('TLS_SM4_GCM_SM3', False, False, '[RFC8998]'),
    0x00C7: ('TLS_SM4_CCM_SM3', False, False, '[RFC8998]'),
    0x00FF: ('TLS_EMPTY_RENEGOTIATION_INFO_SCSV', True, False, '[RFC5746]'),
    0x1301: ('TLS_AES_128_GCM_SHA256', True, True, '[RFC8446]'),
    0x1302: ('TLS_AES_256_GCM_SHA384', True, True, '[RFC8446]'),
    0x1303: ('TLS_CHACHA20_POLY1305_SHA256', True, True, '[RFC8446]'),
    0x1304: ('TLS_AES_128_CCM_SHA256', True, True, '[RFC8446]'),
    0x1305: ('TLS_AES_128_CCM_8_SHA256', True, False, '[RFC8446][IESG Action 2018-08-16]'),
    0x1306: ('TLS_AEGIS_256_SHA384', True, False, '[draft-irtf-cfrg-aegis-aead-00]'),
    0x1307: ('TLS_AEGIS_128L_SHA256', True, False, '[draft-irtf-cfrg-aegis-aead-00]'),
    0x5600: ('TLS_FALLBACK_SCSV', True, False, '[RFC7507]'),
    0xC001: ('TLS_ECDH_ECDSA_WITH_NULL_SHA', True, False, '[RFC8422]'),
    0xC002: ('TLS_ECDH_ECDSA_WITH_RC4_128_SHA', False, False, '[RFC8422][RFC6347]'),
    0xC003: ('TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC8422]'),
    0xC004: ('TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA', True, False, '[RFC8422]'),
    0xC005: ('TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA', True, False, '[RFC8422]'),
    0xC006: ('TLS_ECDHE_ECDSA_WITH_NULL_SHA', True, False, '[RFC8422]'),
    0xC007: ('TLS_ECDHE_ECDSA_WITH_RC4_128_SHA', False, False, '[RFC8422][RFC6347]'),
    0xC008: ('TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC8422]'),
    0xC009: ('TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA', True, False, '[RFC8422]'),
    0xC00A: ('TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA', True, False, '[RFC8422]'),
    0xC00B: ('TLS_ECDH_RSA_WITH_NULL_SHA', True, False, '[RFC8422]'),
    0xC00C: ('TLS_ECDH_RSA_WITH_RC4_128_SHA', False, False, '[RFC8422][RFC6347]'),
    0xC00D: ('TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC8422]'),
    0xC00E: ('TLS_ECDH_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC8422]'),
    0xC00F: ('TLS_ECDH_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC8422]'),
    0xC010: ('TLS_ECDHE_RSA_WITH_NULL_SHA', True, False, '[RFC8422]'),
    0xC011: ('TLS_ECDHE_RSA_WITH_RC4_128_SHA', False, False, '[RFC8422][RFC6347]'),
    0xC012: ('TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC8422]'),
    0xC013: ('TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC8422]'),
    0xC014: ('TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC8422]'),
    0xC015: ('TLS_ECDH_anon_WITH_NULL_SHA', True, False, '[RFC8422]'),
    0xC016: ('TLS_ECDH_anon_WITH_RC4_128_SHA', False, False, '[RFC8422][RFC6347]'),
    0xC017: ('TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC8422]'),
    0xC018: ('TLS_ECDH_anon_WITH_AES_128_CBC_SHA', True, False, '[RFC8422]'),
    0xC019: ('TLS_ECDH_anon_WITH_AES_256_CBC_SHA', True, False, '[RFC8422]'),
    0xC01A: ('TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5054]'),
    0xC01B: ('TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5054]'),
    0xC01C: ('TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5054]'),
    0xC01D: ('TLS_SRP_SHA_WITH_AES_128_CBC_SHA', True, False, '[RFC5054]'),
    0xC01E: ('TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA', True, False, '[RFC5054]'),
    0xC01F: ('TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA', True, False, '[RFC5054]'),
    0xC020: ('TLS_SRP_SHA_WITH_AES_256_CBC_SHA', True, False, '[RFC5054]'),
    0xC021: ('TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA', True, False, '[RFC5054]'),
    0xC022: ('TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA', True, False, '[RFC5054]'),
    0xC023: ('TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5289]'),
    0xC024: ('TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384', True, False, '[RFC5289]'),
    0xC025: ('TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5289]'),
    0xC026: ('TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384', True, False, '[RFC5289]'),
    0xC027: ('TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5289]'),
    0xC028: ('TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384', True, False, '[RFC5289]'),
    0xC029: ('TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256', True, False, '[RFC5289]'),
    0xC02A: ('TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384', True, False, '[RFC5289]'),
    0xC02B: ('TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256', True, True, '[RFC5289]'),
    0xC02C: ('TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384', True, True, '[RFC5289]'),
    0xC02D: ('TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256', True, False, '[RFC5289]'),
    0xC02E: ('TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384', True, False, '[RFC5289]'),
    0xC02F: ('TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256', True, True, '[RFC5289]'),
    0xC030: ('TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384', True, True, '[RFC5289]'),
    0xC031: ('TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256', True, False, '[RFC5289]'),
    0xC032: ('TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384', True, False, '[RFC5289]'),
    0xC033: ('TLS_ECDHE_PSK_WITH_RC4_128_SHA', False, False, '[RFC5489][RFC6347]'),
    0xC034: ('TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA', True, False, '[RFC5489]'),
    0xC035: ('TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA', True, False, '[RFC5489]'),
    0xC036: ('TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA', True, False, '[RFC5489]'),
    0xC037: ('TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256', True, False, '[RFC5489]'),
    0xC038: ('TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384', True, False, '[RFC5489]'),
    0xC039: ('TLS_ECDHE_PSK_WITH_NULL_SHA', True, False, '[RFC5489]'),
    0xC03A: ('TLS_ECDHE_PSK_WITH_NULL_SHA256', True, False, '[RFC5489]'),
    0xC03B: ('TLS_ECDHE_PSK_WITH_NULL_SHA384', True, False, '[RFC5489]'),
    0xC03C: ('TLS_RSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC03D: ('TLS_RSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC03E: ('TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC03F: ('TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC040: ('TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC041: ('TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC042: ('TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC043: ('TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC044: ('TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC045: ('TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC046: ('TLS_DH_anon_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC047: ('TLS_DH_anon_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC048: ('TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC049: ('TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC04A: ('TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC04B: ('TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC04C: ('TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC04D: ('TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC04E: ('TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC04F: ('TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC050: ('TLS_RSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC051: ('TLS_RSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC052: ('TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC053: ('TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC054: ('TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC055: ('TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC056: ('TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC057: ('TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC058: ('TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC059: ('TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC05A: ('TLS_DH_anon_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC05B: ('TLS_DH_anon_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC05C: ('TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC05D: ('TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC05E: ('TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC05F: ('TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC060: ('TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC061: ('TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC062: ('TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC063: ('TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC064: ('TLS_PSK_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC065: ('TLS_PSK_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC066: ('TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC067: ('TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC068: ('TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC069: ('TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC06A: ('TLS_PSK_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC06B: ('TLS_PSK_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC06C: ('TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC06D: ('TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC06E: ('TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256', True, False, '[RFC6209]'),
    0xC06F: ('TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384', True, False, '[RFC6209]'),
    0xC070: ('TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256', True, False, '[RFC6209]'),
    0xC071: ('TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384', True, False, '[RFC6209]'),
    0xC072: ('TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC073: ('TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC074: ('TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC075: ('TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC076: ('TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC077: ('TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC078: ('TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC079: ('TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC07A: ('TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC07B: ('TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC07C: ('TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC07D: ('TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC07E: ('TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC07F: ('TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC080: ('TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC081: ('TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC082: ('TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC083: ('TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC084: ('TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC085: ('TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC086: ('TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC087: ('TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC088: ('TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC089: ('TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC08A: ('TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC08B: ('TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC08C: ('TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC08D: ('TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC08E: ('TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC08F: ('TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC090: ('TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC091: ('TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC092: ('TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256', True, False, '[RFC6367]'),
    0xC093: ('TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384', True, False, '[RFC6367]'),
    0xC094: ('TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC095: ('TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC096: ('TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC097: ('TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC098: ('TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC099: ('TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC09A: ('TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256', True, False, '[RFC6367]'),
    0xC09B: ('TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384', True, False, '[RFC6367]'),
    0xC09C: ('TLS_RSA_WITH_AES_128_CCM', True, False, '[RFC6655]'),
    0xC09D: ('TLS_RSA_WITH_AES_256_CCM', True, False, '[RFC6655]'),
    0xC09E: ('TLS_DHE_RSA_WITH_AES_128_CCM', True, True, '[RFC6655]'),
    0xC09F: ('TLS_DHE_RSA_WITH_AES_256_CCM', True, True, '[RFC6655]'),
    0xC0A0: ('TLS_RSA_WITH_AES_128_CCM_8', True, False, '[RFC6655]'),
    0xC0A1: ('TLS_RSA_WITH_AES_256_CCM_8', True, False, '[RFC6655]'),
    0xC0A2: ('TLS_DHE_RSA_WITH_AES_128_CCM_8', True, False, '[RFC6655]'),
    0xC0A3: ('TLS_DHE_RSA_WITH_AES_256_CCM_8', False, False, '[RFC6655]'),
    0xC0A4: ('TLS_PSK_WITH_AES_128_CCM', True, False, '[RFC6655]'),
    0xC0A5: ('TLS_PSK_WITH_AES_256_CCM', True, False, '[RFC6655]'),
    0xC0A6: ('TLS_DHE_PSK_WITH_AES_128_CCM', True, True, '[RFC6655]'),
    0xC0A7: ('TLS_DHE_PSK_WITH_AES_256_CCM', True, True, '[RFC6655]'),
    0xC0A8: ('TLS_PSK_WITH_AES_128_CCM_8', True, False, '[RFC6655]'),
    0xC0A9: ('TLS_PSK_WITH_AES_256_CCM_8', True, False, '[RFC6655]'),
    0xC0AA: ('TLS_PSK_DHE_WITH_AES_128_CCM_8', True, False, '[RFC6655]'),
    0xC0AB: ('TLS_PSK_DHE_WITH_AES_256_CCM_8', True, False, '[RFC6655]'),
    0xC0AC: ('TLS_ECDHE_ECDSA_WITH_AES_128_CCM', True, False, '[RFC7251]'),
    0xC0AD: ('TLS_ECDHE_ECDSA_WITH_AES_256_CCM', True, False, '[RFC7251]'),
    0xC0AE: ('TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8', True, False, '[RFC7251]'),
    0xC0AF: ('TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8', True, False, '[RFC7251]'),
    0xC0B0: ('TLS_ECCPWD_WITH_AES_128_GCM_SHA256', True, False, '[RFC8492]'),
    0xC0B1: ('TLS_ECCPWD_WITH_AES_256_GCM_SHA384', True, False, '[RFC8492]'),
    0xC0B2: ('TLS_ECCPWD_WITH_AES_128_CCM_SHA256', True, False, '[RFC8492]'),
    0xC0B3: ('TLS_ECCPWD_WITH_AES_256_CCM_SHA384', True, False, '[RFC8492]'),
    0xC0B4: ('TLS_SHA256_SHA256', True, False, '[RFC9150]'),
    0xC0B5: ('TLS_SHA384_SHA384', True, False, '[RFC9150]'),
    0xC100: ('TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC', False, False, '[RFC9189]'),
    0xC101: ('TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC', False, False, '[RFC9189]'),
    0xC102: ('TLS_GOSTR341112_256_WITH_28147_CNT_IMIT', False, False, '[RFC9189]'),
    0xC103: ('TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_L', False, False, '[RFC9367]'),
    0xC104: ('TLS_GOSTR341112_256_WITH_MAGMA_MGM_L', False, False, '[RFC9367]'),
    0xC105: ('TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_S', False, False, '[RFC9367]'),
    0xC106: ('TLS_GOSTR341112_256_WITH_MAGMA_MGM_S', False, False, '[RFC9367]'),
    0xCCA8: ('TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256', True, True, '[RFC7905]'),
    0xCCA9: ('TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256', True, True, '[RFC7905]'),
    0xCCAA: ('TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256', True, True, '[RFC7905]'),
    0xCCAB: ('TLS_PSK_WITH_CHACHA20_POLY1305_SHA256', True, False, '[RFC7905]'),
    0xCCAC: ('TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256', True, True, '[RFC7905]'),
    0xCCAD: ('TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256', True, True, '[RFC7905]'),
    0xCCAE: ('TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256', True, False, '[RFC7905]'),
    0xD001: ('TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256', True, True, '[RFC8442]'),
    0xD002: ('TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384', True, True, '[RFC8442]'),
    0xD003: ('TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256', True, False, '[RFC8442]'),
    0xD005: ('TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256', True, True, '[RFC8442]'),
}

def handshake(option: tuple):
    '''
    @param cs: CipherSuite
    @param ver:
        0: tls 1.0
        1: tls 1.1
        2: tls 1.2
    @param host: url
    @param port: https port
    '''
    cs, ver, host, port = option
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
    try:
        sock.connect((host, port))
    except TimeoutError:
        return False

    # client hello
    hello = bytes((3,ver+1)) + random.randbytes(32)
    hello += b'\x00' # session id length
    hello += struct.pack(f'>2H', 2, cs) # cipher suite
    hello += b'\x01\x00' # Compression method NULL
    if ver == 2:
        hello += b'\x00\x00' # Extensions Length: 0
    # HandshakeType 1: client_hello
    buf = b'\x01\x00' + struct.pack('>H', len(hello)) + hello

    # record layer
    #    handshake
    req = b'\x16' + bytes((3,ver+1)) + struct.pack('>H', len(buf)) + buf
    sock.send(req)

    try:
        r = sock.recv(5)
    except ConnectionResetError:
        return False
    while len(r) < 5:
        r += sock.recv(5 - len(r))
    contentType, v, n = struct.unpack('>B2H', r)
    if contentType != 22: # handshake
        return False
    assert v == 0x301+ver # tls 1.x
    buf = b''
    while len(buf) < n:
        buf += sock.recv(n - len(buf))
    assert buf[0] == 2 # server_hello
    n, = struct.unpack('>L', b'\x00' + buf[1:4])
    r_e = buf[4:] # struct ServerHello
    n = r_e[34] # SessionID length
    rcs, = struct.unpack('>H', r_e[35+n:37+n]) # 35+n: start of CipherSuite

    sock.shutdown(socket.SHUT_RDWR)
    sock.close()

    assert rcs == cs
    return True

def main():
    if len(sys.argv) != 2:
        return

    host = sys.argv[1]

    args = [(k,ver,host,443) for k in CipherSuites.keys() for ver in range(3)]

    with ThreadPoolExecutor() as executor:
        res = list(executor.map(handshake, args))
        assert len(args) == len(res)
        res = [i for i,x in enumerate(res) if x]
    if len(res) < 1:
        print('no cipher suites supported!')
        return
    t = {}
    for i in res:
        t.setdefault(args[i][0], set())
        t[args[i][0]].add(args[i][1])

    tks = sorted(list(t.keys()))
    maxlen_name = max([len(CipherSuites[k][0]) for k in tks])
    title_value = 'Cipher Suites value'
    title_name = 'Cipher Suites name'
    maxlen_name = max(maxlen_name, len(title_name))
    print(f'1.0\t1.1\t1.2\t{title_value} '+f'{{:<{maxlen_name}}}'.format(title_name)+' dtls-ok recommended reference')

    len_dtls_ok = len('dtls-ok')
    len_recommended = len('recommended')

    for k in tks:
        vs = ''.join(['x\t' if v in t[k] else '\t' for v in range(3)])
        cs,dtls_ok,recommended,reference = CipherSuites[k]
        dtls_ok = 'T' if dtls_ok else 'F'
        recommended = 'T' if recommended else 'F'
        s_k = f'0x{k:04X}'
        s = f'{{:<{len(title_value)}}} {{:<{maxlen_name}}} {{:<{len_dtls_ok}}} {{:<{len_recommended}}} {{}}'.format(s_k,cs,dtls_ok,recommended,reference)
        print(vs + s)

if __name__=='__main__':
    main()